package web.mb;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;







import java.util.Set;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import metier.entities.Client;
import metier.entities.ClientAbonnement;
import metier.entities.GLN;
import metier.entities.Pays;
import metier.entities.Utilisateur;
import metier.sess.IPaysLocal;
import metier.sess.IUtilisateurLocal;

@ManagedBean
@RequestScoped
public class ExpiryMB {
	
	public class expiration{
		private Client c;
		private Date d;
		private GLN gln;
		public Client getC() {
			return c;
		}
		public void setC(Client c) {
			this.c = c;
		}
		public Date getD() {
			return d;
		}
		public void setD(Date d) {
			this.d = d;
		}
		public GLN getGln() {
			return gln;
		}
		public void setGln(GLN gln) {
			this.gln = gln;
		}
		
	};
	
	@EJB
	 private IPaysLocal metierp;
	
	@EJB
	private IUtilisateurLocal metierUser;
	private  Integer IdPays=new Integer(0); 
	private  Integer Mounth=new Integer(0);
	private   Integer  Year=new Integer(0);
	
	private List<Integer> listeINT=new ArrayList<Integer>();
	
	@PostConstruct
	public void liste()
	{
		
		for(int i=2012;i<2051;i++)
		{
			listeINT.add(i);
		}
		
	}
	
	public List<Integer> getListeINT() {
		return listeINT;
	}


	public void setListeINT(List<Integer> listeINT) {
		this.listeINT = listeINT;
	}


	public List<Pays> listPays()
	{
		return  metierp.getAllPaysActive();
	}
	
	public List<expiration> listeExpiry(String Type,String cat)
	{
	
		boolean pays=true;
		
		
		//mois
		boolean dateAss=true;
		boolean dateGLN=true;
		boolean dateAbn=true;
		
		//ans
		boolean yearAss=true;
		boolean yearGLN=true;
		boolean yearAbn=true;
		
		List<expiration> l=new ArrayList<ExpiryMB.expiration>();
		List<Client> listeUser= metierUser.listClient(Type, cat);
		
		for(int i=0;i<listeUser.size();i++)
		{
			
			expiration e=new expiration();
			e.c=listeUser.get(i);
			
			//tester la ville
			if(IdPays!=0  )
			{
				
				boolean a=true;
				if(e.c.getType_client().compareTo("Pro")==0)
				{
					a=(listeUser.get(i).getVille_postal().getEtat().getPays().getIdPays()==IdPays) || (listeUser.get(i).getVille_Societe().getEtat().getPays().getIdPays()==IdPays);
				}
				else
				{
					a=(listeUser.get(i).getVille_Utilisateur().getEtat().getPays().getIdPays()==IdPays);
				}
				
				
				if(a)
			      pays=true;
				else
				  pays=false;
			}
			
			//tester les mois
			
			Calendar calendar = new GregorianCalendar();

			if(Mounth!=0)
			{
				
				if(e.c.getType_client().compareTo("Pro")==0)
				{
					if(e.c.getTranExp().compareTo("Tra")==0)
					{
				//tester la date d'expiration de l'assurance
				calendar.setTime(listeUser.get(i).getAsssurance_Expiration());
				if(calendar.get(Calendar.MONTH)==Mounth)
				{
					dateAss=true;
				}
				else
				{
					dateAss=false;
				}
					}
				
				//tester la date d'expiration du gs1 membership
				
				if(listeUser.get(i).getList_GLN().size()!=0)
				{
					e.gln=listeUser.get(i).getList_GLN().get(0);
				calendar.setTime(e.gln.getDate_Expiration());
				if(calendar.get(Calendar.MONTH)==Mounth)
				{
					dateGLN=true;
				}
				else
				{
					dateGLN=false;
				}
				
				}
				else
					dateGLN=false;	
				}
				
				//tester la date d'expiration du movecargo membership
				if(listeUser.get(i).getCABs().size()!=0)
				{
					
					e.d=maxDate(listeUser.get(i).getCABs());
					calendar.setTime(e.d);
					if(calendar.get(Calendar.MONTH)==Mounth)
					{
						dateAbn=true;
					}
					else
					{
						dateAbn=false;
					}
					
				}
				else
					dateAbn=false;
				
				
			}

			
			
			//tester les années
			if(Year!=0)
			{
				
				if(e.c.getType_client().compareTo("Pro")==0)
				{
					
					if(e.c.getTranExp().compareTo("Tra")==0)
					{
				//tester la date d'expiration de l'assurance
				calendar.setTime(listeUser.get(i).getAsssurance_Expiration());
				if(calendar.get(Calendar.YEAR)==Year)
				{
					yearAss=true;
				}
				else
				{
					yearAss=false;
				}
					}
				
				//tester la date d'expiration du gs1 membership
				if(listeUser.get(i).getList_GLN().size()!=0)
				{
					e.gln=listeUser.get(i).getList_GLN().get(0);
					calendar.setTime(e.gln.getDate_Expiration());
					
					if(calendar.get(Calendar.YEAR)==Year)
					{
						yearGLN=true;
					}
					else
					{
						yearGLN=false;
					}
				}
				else
					yearGLN=false;
				}
				
				
				//tester la date d'expiration du movecargo membership
				if(listeUser.get(i).getCABs().size()!=0)
				{
					e.d=maxDate(listeUser.get(i).getCABs());
					calendar.setTime(e.d);
					if(calendar.get(Calendar.YEAR)==Year)
					{
						yearAbn=true;
					}
					else
					{
						yearAbn=false;
					}
				}
				else
					yearAbn=false;
				
			}
			
			if((Mounth!=0) || (Year!=0) || (IdPays!=0) )
			{
             
				if(e.c.getType_client().compareTo("Pri")==0)
				{
					if(pays && dateAbn && yearAbn)
					{
						
						l.add(e);
					}
				}
				else
				{
					if(e.c.getTranExp().compareTo("Tra")==0)
					{
					if(pays && (dateAss || dateAbn || dateGLN) && (yearAbn || yearGLN || yearAss) )
					{
						
						l.add(e);
					}
					}
					else
					{
						if(pays && ( dateAbn || dateGLN) && (yearAbn || yearGLN) )
						{
							
							l.add(e);
						}
					}
						
				}
				
			}
			else
			{
				if(e.c.getType_client().compareTo("Pro")==0)
				{
				if(listeUser.get(i).getList_GLN().size()!=0)
				{
					e.gln=listeUser.get(i).getList_GLN().get(0);
				}
				}
				
				if(listeUser.get(i).getCABs().size()!=0)
				{
					e.d=maxDate(listeUser.get(i).getCABs());
				}
				l.add(e);
			}
			
			}
		return l;
	}
	
	//filter
	public void filter()
	{
		
	}
	public Date maxDate(List<ClientAbonnement> l)
	{
		Date max=l.get(0).getDateFin();
		for(int i=0;i<l.size();i++)
		{
			if(l.get(i).getDateFin().compareTo(max)>0)
			{
				max=l.get(i).getDateFin();
			}
		}
		return max;
	}
	public  Integer getIdPays() {
		return IdPays;
	}

	public  void setIdPays(Integer idPays) {
		IdPays = idPays;
	}

	public  Integer getMounth() {
		return Mounth;
	}

	public  void setMounth(Integer mounth) {
		Mounth = mounth;
	}

	public  Integer getYear() {
		return Year;
	}

	public  void setYear(Integer year) {
		Year = year;
	}
	

}
